package com.ryder.petmatediarybackend.common.util;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;

/**
 * 描述: 敏感信息脱敏工具类（企业级）
 * 用于日志输出、接口返回等场景的敏感数据脱敏处理
 *
 * @author Ryder
 * @version 2.0
 * @since 1.0
 * 更新日期: 2025/10/27
 */
public final class SensitiveMaskUtil {

    private SensitiveMaskUtil() {}

    /**
     * 手机号脱敏：保留前3后4，中间用 * 代替
     * 示例：138****5678
     */
    public static String maskPhone(String phone) {
        if (StringUtils.isBlank(phone)) {
            return null;
        }
        String raw = phone.trim();
        if (raw.length() != 11) {
            return "***";
        }
        return raw.substring(0, 3) + "****" + raw.substring(7);
    }

    /**
     * 邮箱脱敏：保留前2位和@后的域名，中间用 * 代替
     * 示例：ry****@example.com
     */
    public static String maskEmail(String email) {
        if (StringUtils.isBlank(email)) {
            return null;
        }
        String raw = email.trim();
        int atIndex = raw.indexOf('@');
        if (atIndex <= 0) {
            return "***";
        }
        String prefix = raw.substring(0, Math.min(2, atIndex));
        String suffix = raw.substring(atIndex);
        return prefix + "****" + suffix;
    }

    /**
     * 身份证号脱敏：保留前3后4，中间用 * 代替
     * 示例：110***********1234
     */
    public static String maskIdCard(String idCard) {
        if (StringUtils.isBlank(idCard)) {
            return null;
        }
        String raw = idCard.trim();
        if (raw.length() <= 7) {
            return raw.charAt(0) + "***" + raw.charAt(raw.length() - 1);
        }
        String prefix = raw.substring(0, 3);
        String suffix = raw.substring(raw.length() - 4);
        return prefix + "***********".substring(0, Math.max(0, raw.length() - 7)) + suffix;
    }

    /**
     * 姓名脱敏：保留姓，名字用 * 代替
     * 示例：张** / 欧阳**
     */
    public static String maskName(String name) {
        if (StringUtils.isBlank(name)) {
            return null;
        }
        String raw = name.trim();
        if (raw.length() == 1) {
            return "*";
        }
        if (raw.length() == 2) {
            return raw.charAt(0) + "*";
        }
        // 复姓保留前2位
        if (raw.length() >= 3) {
            return raw.substring(0, 1) + "**";
        }
        return "***";
    }

    /**
     * 银行卡号脱敏：保留前4后4，中间用 * 代替
     * 示例：6222 **** **** 1234
     */
    public static String maskBankCard(String bankCard) {
        if (StringUtils.isBlank(bankCard)) {
            return null;
        }
        String raw = bankCard.trim().replaceAll("\\s+", "");
        if (raw.length() <= 8) {
            return "****";
        }
        String prefix = raw.substring(0, 4);
        String suffix = raw.substring(raw.length() - 4);
        int maskLength = raw.length() - 8;
        return prefix + " " + "*".repeat(Math.min(maskLength, 12)) + " " + suffix;
    }

    /**
     * 地址脱敏：保留省市，详细地址用 * 代替
     * 示例：北京市朝阳区****
     */
    public static String maskAddress(String address) {
        if (StringUtils.isBlank(address)) {
            return null;
        }
        String raw = address.trim();
        if (raw.length() <= 6) {
            return raw.substring(0, Math.min(3, raw.length())) + "***";
        }
        // 保留前6位（通常是省市区）
        return raw.substring(0, 6) + "****";
    }

    /**
     * IP地址脱敏：保留前两段，后两段用 * 代替
     * 示例：192.168.*.*
     */
    public static String maskIp(String ip) {
        if (StringUtils.isBlank(ip)) {
            return null;
        }
        String raw = ip.trim();
        String[] parts = raw.split("\\.");
        if (parts.length != 4) {
            return "*.*.*.*";
        }
        return parts[0] + "." + parts[1] + "." + "*" + "." + "*";
    }

    /**
     * 密码脱敏：全部用 * 代替（用于日志输出）
     * 示例：******
     */
    public static String maskPassword(String password) {
        if (StringUtils.isBlank(password)) {
            return null;
        }
        return "******";
    }

    /**
     * 通用脱敏：保留前后各n位，中间用 * 代替
     *
     * @param data 原始数据
     * @param prefixLen 保留前缀长度
     * @param suffixLen 保留后缀长度
     * @return 脱敏后的数据
     */
    public static String mask(String data, int prefixLen, int suffixLen) {
        if (StringUtils.isBlank(data)) {
            return null;
        }
        String raw = data.trim();
        if (raw.length() <= prefixLen + suffixLen) {
            return "***";
        }
        String prefix = raw.substring(0, prefixLen);
        String suffix = raw.substring(raw.length() - suffixLen);
        int maskLength = raw.length() - prefixLen - suffixLen;
        return prefix + "*".repeat(Math.min(maskLength, 10)) + suffix;
    }
}